package com.loong.android.utils;

import static android.content.Context.BIND_AUTO_CREATE;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;

import com.loong.android.LonApp;
import com.loong.android.LonWin;

/**
 * 上下文操作工具
 */
public class ContextUtils {
    public static Activity getActivity() {
        LonApp app = LonApp.getInstance();
        if(app == null) return null;
        return app.getCurrentActivity();
    }

    public static LonWin getWin() {
        LonApp app = LonApp.getInstance();
        if(app == null) return null;
        Activity activity = app.getCurrentActivity();
        if(!(activity instanceof LonWin)) return null;
        return (LonWin) activity;
    }

    public static Context getAppContext() {
        LonApp app = LonApp.getInstance();
        if(app == null) return null;
        return app.getApplicationContext();
    }


    /**
     * 获取应用的上下文
     * @param context 上下文
     */
    public static Context getAppContext(Context context) {
        return context.getApplicationContext();
    }

    /**
     * 获取应用的包名
     * @param context 上下文
     */
    public static String getPackageName(Context context) {
        return context.getPackageName();
    }

    /**
     * 启动窗口
     * @param targetWin 目标窗口数据
     * @param intent 意图数据
     * @param flags 标志位数组
     */
    public static void startWin(Context context, Class<? extends Activity> targetWin, Intent intent, int[] flags) {
        Intent in = intent != null ? intent : new Intent();
        if (flags != null && flags.length > 0) {
            for (int flag : flags) {
                in.addFlags(flag);
            }
        }
        in.setClass(context, targetWin);
        context.startActivity(in);
    }

    /**
     * 启动窗口
     * @param intent 意图数据对象
     */
    public static void startWin(Context context, Intent intent) {
        context.startActivity(intent);
    }

    /**
     * 启动窗口
     * @param targetWin 目标窗口数据
     */
    public static void startWin(Context context, Class<? extends Activity> targetWin) {
        startWin(context, targetWin, null, null);
    }

    /**
     * 启动窗口
     * @param targetWin 目标窗口数据
     * @param intent 意图数据
     */
    public static void startWin(Context context, Class<? extends Activity> targetWin, Intent intent) {
        startWin(context, targetWin, intent, null);
    }

    /**
     * 启动窗口
     * @param targetWin 目标窗口数据
     * @param flags 标志位数组
     */
    public static void startWin(Context context, Class<? extends Activity> targetWin, int[] flags) {
        startWin(context, targetWin, null, flags);
    }

    /**
     * 启动窗口并监听这个窗口返回的结果。其他窗口返回的结果在onOtherWinClose事件中获得
     * @param targetWin 目标窗口数据
     * @param intent 意图数据
     * @param requestCode 请求码
     * @param bundle 附加数据
     * @param flags 标志位数组
     */
    public static void startWinResult(Context context, Class<? extends Activity> targetWin, Intent intent, int requestCode, Bundle bundle, int[] flags) {
        Intent in = intent != null ? intent : new Intent();
        if (flags != null && flags.length > 0) {
            for (int flag : flags) {
                in.addFlags(flag);
            }
        }
        in.setClass(context, targetWin);
        ((Activity)context).startActivityForResult(in, requestCode, bundle);
    }

    /**
     * 启动窗口并监听这个窗口返回的结果。其他窗口返回的结果在onOtherWinClose事件中获得
     * @param targetWin 目标窗口数据
     * @param intent 意图数据
     * @param requestCode 请求码
     * @param flags 标志位数组
     */
    public static void startWinResult(Context context, Class<? extends Activity> targetWin, Intent intent, int requestCode, int[] flags) {
        startWinResult(context, targetWin, intent, requestCode, null, flags);
    }

    /**
     * 启动窗口并监听这个窗口返回的结果。其他窗口返回的结果在onOtherWinClose事件中获得
     * @param targetWin 目标窗口数据
     * @param intent 意图数据
     * @param requestCode 请求码
     */
    public static void startWinResult(Context context, Class<? extends Activity> targetWin, Intent intent, int requestCode) {
        startWinResult(context, targetWin, intent, requestCode, null, null);
    }

    /**
     * 启动窗口并监听这个窗口返回的结果。其他窗口返回的结果在onOtherWinClose事件中获得
     * @param targetWin 目标窗口数据
     * @param requestCode 请求码
     */
    public static void startWinResult(Context context, Class<? extends Activity> targetWin, int requestCode) {
        startWinResult(context, targetWin, null, requestCode, null, null);
    }

    /**
     * 启动窗口并监听这个窗口返回的结果。其他窗口返回的结果在onOtherWinClose事件中获得
     * @param intent 目标窗口数据
     * @param requestCode 请求码
     */
    public static void startWinResult(Context context, Intent intent, int requestCode) {
        ((Activity)context).startActivityForResult(intent, requestCode);
    }

    /**
     * 启动窗口并监听这个窗口返回的结果。其他窗口返回的结果在onOtherWinClose事件中获得
     * @param targetWin 目标窗口数据
     * @param requestCode 请求码
     * @param flags 标志位数组
     */
    public static void startWinResult(Context context, Class<? extends Activity> targetWin, int requestCode, int[] flags) {
        startWinResult(context, targetWin, null, requestCode, null, flags);
    }


    /**
     * 启动服务
     *
     * @param intent 意图数据对象
     */
    public static void startService(Context context, Intent intent) {
        context.startService(intent);
    }

    /**
     * 停止后台服务
     * @param intent 意图数据
     */
    public static boolean stopService(Context context, Intent intent) {
        return context.stopService(intent);
    }

    /**
     * 绑定服务
     *
     * @param intent 意图数据对象
     * @param connection 服务连接器对象
     * @param flags 标志位
     */
    public static void bindService(Context context, Intent intent, ServiceConnection connection, int flags) {
        context.bindService(intent, connection, flags);
    }

    /**
     * 绑定服务
     *
     * @param intent 意图数据对象
     * @param connection 服务连接器对象
     */
    public static void bindService(Context context, Intent intent, ServiceConnection connection) {
        context.bindService(intent, connection, BIND_AUTO_CREATE);
    }

    /**
     * 解绑服务
     *
     * @param connection 服务连接器对象
     */
    public static void unbindService(Context context, ServiceConnection connection) {
        context.unbindService(connection);
    }

    /**
     * 注册广播对象
     *
     * @param receiver 广播接收器
     * @param filter 意图过滤器对象
     */
    public static void registerBroadcast(Context context, BroadcastReceiver receiver, IntentFilter filter) {
        context.registerReceiver(receiver, filter);
    }

    /**
     * 注册广播对象，仅在安卓8.0(api26)及以上版本有效。
     *
     * @param receiver 广播接收器
     * @param filter 意图过滤器对象
     * @param flags 标志位
     */
    public static void registerBroadcast(Context context, BroadcastReceiver receiver, IntentFilter filter, int flags) {
        if(Build.VERSION.SDK_INT < 26) return;
        context.registerReceiver(receiver, filter, flags);
    }

    /**
     * 注销广播
     *
     * @param receiver 广播接收器
     */
    public static void unregisterBroadcast(Context context, BroadcastReceiver receiver) {
        context.unregisterReceiver(receiver);
    }

    /**
     * 发送广播
     * @param intent 意图数据对象
     */
    public static void sendBroadcast(Context context, Intent intent) {
        context.sendBroadcast(intent);
    }

    /**
     * 发送广播
     * @param intent 意图数据对象
     * @param permission 要求接收广播者必须拥有该权限才能接收到该广播。若为空(null)则表示不限制。
     */
    public static void sendBroadcast(Context context, Intent intent, String permission) {
        context.sendBroadcast(intent, permission);
    }
}
